﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//原码，反码，补码（过）


//移位操作符
//<<左移操作符，>>右移操作符
//int main()
//{
//	int a = 1;//a(1)的原码(正数原码，反码，补码相同)00000000000000000000000000000001(1)
//	a <<= 1;//左移一位后原码(补码)00000000000000000000000000000010(2)
//	printf("%d", a);
//	return 0;
//}
//左移左去一位，右补0(注意：是对补码进行操作)；右移分两种，逻辑右移：左边补0；算数右移：左边补符号位同值


//位操作符
//两个整型的2进制数之间的运算
//&(按位与)：有0取0，同为1取1
//|(按位或)：有1取1，同为0取0
//^(按位异或)：同取0，异取1
//~(按位取反)：全部取反
//int main()
//{
//	int a = -12;		  //原码10000000000000000000000000001100（32位）
//						  //反码11111111111111111111111111110011
//						  //补码11111111111111111111111111110100
//	
//	int b = 21;			  //原码00000000000000000000000000010101
//						  //补码00000000000000000000000000010101
//	
//	printf("%d\n", a & b);//补码00000000000000000000000000010100
//						  //原码00000000000000000000000000010100(20)
//
//	printf("%d\n", a | b);//补码11111111111111111111111111110101
//						  //原码10000000000000000000000000001011(-11)
//
//	printf("%d\n", a ^ b);//补码11111111111111111111111111100001
//						  //原码10000000000000000000000000011111(-30)
//
//	printf("%d\n", ~a);
//				   //a补码的反码00000000000000000000000000001011
//						  //原码00000000000000000000000000001011(11)
//	return 0;
//}
//切记：一切操作均建立在补码上


//试题
//1.不能创建变量，实现两个数的交换
//int main()
//{
//	int a = 2;//^,同取0，异取1
//	int b = 3;//b ^ b = 0；a ^ 0 = a;从这里看出，^运算应该是满足交换律与结合律
//	printf("a=%d b=%d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;//b = (a ^ b) ^ b = a
//	a = a ^ b;//a = (a ^ b) ^ a = b
//	printf("a=%d b=%d\n", a, b);
//	return 0;
//}
//想法优秀

//2.编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。
//int main()
//{
//	int n = 7;//原码00000111(图个方便用8位，实际上占用32位)
//		   //1的原码00000001；|有0取0,同为1取1
//	int count = 0;
//	//int i = 0;
//	//for (i = 0; i < 32; i++)
//	//{
//	//	if (n & (1 << i))
//	//		count++;
//	//}
//	while (n)
//	{
//		count++;
//		n = n & (n - 1);
//	}//巧，妙，恨我才浅不知如何表达
//	printf("二进制中1的个数为：%d", count);
//	return 0;
//}

//3.编写代码将13（n）⼆进制序列的第5位修改为1，然后再改回0
//int main()
//{
//	int n = 13;			//原码00001101
//					 //1的原码00000001
//	n = n | (1 << 4);	//原码00011101(29)
//	printf("%d\n", n);
//	n = n & ~(1 << 4);
//	printf("%d\n", n);
//	return 0;
//}
// //&（按位与）有0取0；|（按位或）有1取1




//逗号表达式(a,b,c,d,……,n)，括号里的内容从左到右执行，只输出最右边的一个
int main()
{
	int a = 1;
	int b = 2;
	int c = (a++, b--, b += 3, a + b);
	printf("a=%d\nb=%d\nc=%d", a, b, c);
	return 0;
}


